
#属于当前子应用的公共函数或类库方法
import re

from django.contrib.auth.backends import ModelBackend

from users.models import User


def jwt_response_payload_handler(token,user=None,request=None):
    '''
    自定义jwt认证成功返回数据
    :param token:生成token的对象
    :param user:当前已经登录的用户【在登录视图/注册视图中传递进来的】
    :param request:
    :return:
    '''
    return {
        'token':token,
        'user_id':user.id,
        'username':user.username
    }
#为什么要把获取用户信息写成函数
#因为可能其他地方也会用到用户信息，可以直接导入函数即可用
def get_user_by_account(account):
    '''根据账号信息获取用户'''
    try :
        if re.match(r'^1[3-9]\d{9}$',account):
            #用户提交的手机号码
            user= User.objects.filter(mobile=account).first()
        else:
            user=User.objects.filter(username=account).first()
    except User.DoesNotExist:      
        #找不到对应的用户
        return None
    else: 
        return user
#ModelBackend是Django认证系统里的模型
class UsernameMobileAuthBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        '''
        根据用户提供的信息，返回登录用户，自定义用户认证
        :param request: 本次请求的对象
        :param username: 用户名或者手机号码【并不一定是用户名！！！】
        :param password: 登录密码
        :param kwargs: 
        :return: 
        '''
        user = get_user_by_account(username)
        if user is not None and user.check_password(password):
            return user

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings
from . import constants
from  itsdangerous import BadData

def generate_save_user_token_url(user):
    '''使用Isdangrous保存openID，生成access_token'''
    #serializer=Serializer(密钥，有效期秒）
    serializer=Serializer(settings.SECRET_KEY,constants.VERIFY_EMAIL_TOKEN_EXPIRES)
    data={'user_id':user.id}
    token=serializer.dumps(data)
    token=token.decode()
    #拼接url地址
    verify_url=settings.VERIFY_EMAIL_HTML+'?token='+token

    return verify_url


# def check_verify_email_token(token):
#     #serializer=Serializer(密钥，有效期秒）
#     serializer=Serializer(settings.SECRET_KEY,constants.VERIFY_EMAIL_TOKEN_EXPIRES)
#     try:
#         data=serializer.loads(token)
#         return data['user_id']
#     except BadData:
#         return None
def check_verify_email_token(token):
    # serializer = Serializer(秘钥, 有效期秒)
    serializer = Serializer(settings.SECRET_KEY, constants.VERIFY_EMAIL_TOKEN_EXPIRES)
    try:
        data = serializer.loads(token)
        return data["user_id"]
    except BadData:
        return None